﻿#pragma once

#include"Common.h"
#include"ObjectPool.h"//替换new/malloc的使用
#include"PageMap.h"

//单例模式 饿汉
class PageCache
{
public:
	//获取唯一一份PageCache实例对象
	static PageCache* GetInstance()
	{
		return &_sInst;
	}

	// 获取⼀个K⻚的span 
	Span* NewSpan(size_t k);

	// 获取从对象到span的映射 
	Span* MapObjectToSpan(void* obj);

	// 释放空闲span回到Pagecache，并合并相邻的span 
	void ReleaseSpanToPageCache(Span* span);

	std::mutex _pageMtx;		//锁	不是桶锁，要考虑页切分合并
								//可能访问多个桶
private:
	SpanList _spanLists[NPAGES];

	ObjectPool<Span> _spanPool;	//针对Span类对象的定长内存池

	//std::unordered_map<PAGE_ID, Span*>	_idSpanMap;//页号和Span地址的映射
	TCMalloc_PageMap1<32 - PAGE_SHIFT> _idSpanMap;//使用基数树

private:
	PageCache()//构造函数私有，不让别人构造
	{}
	PageCache(const PageCache&) = delete;

	static PageCache _sInst;			//此处是声明，要在.cpp内定义
};